package anr.desu.pmo.proyecto.service;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;

import anr.desu.pmo.common.service.MetodoRecursivo;
import anr.desu.pmo.common.util.Utilitario;
import anr.desu.pmo.proyecto.model.Area;
import anr.desu.pmo.proyecto.model.DetalleProyecto;
import anr.desu.pmo.proyecto.model.Empleado;
import anr.desu.pmo.proyecto.model.Proyecto;
import anr.desu.pmo.proyecto.model.TipoEstado;
import anr.desu.pmo.proyecto.model.dao.AreaDAO;
import anr.desu.pmo.proyecto.model.dao.DetalleProyectoDAO;
import anr.desu.pmo.proyecto.model.dao.EmpleadoDAO;
import anr.desu.pmo.proyecto.model.dao.ProyectoDAO;
import anr.desu.pmo.proyecto.model.dao.TipoEstadoDAO;
import anr.desu.pmo.proyecto.model.dao.jpa.JPAAreaDAO;
import anr.desu.pmo.proyecto.model.dao.jpa.JPADetalleProyectoDAO;
import anr.desu.pmo.proyecto.model.dao.jpa.JPAEmpleadoDAO;
import anr.desu.pmo.proyecto.model.dao.jpa.JPAProyectoDAO;
import anr.desu.pmo.proyecto.model.dao.jpa.JPATipoEstadoDAO;

public class RegistroProyectoService {
	
	private EntityManager em;
	private AreaDAO areaDAO;
	private EmpleadoDAO empleadoDAO;
	private TipoEstadoDAO tipoEstadoDAO;
	private ProyectoDAO proyectoDAO;
	
	public RegistroProyectoService(){
		em=Utilitario.getInstance().getEntityManager();
		areaDAO = new JPAAreaDAO(em);
		empleadoDAO = new JPAEmpleadoDAO(em);
		proyectoDAO = new JPAProyectoDAO(em);
		tipoEstadoDAO = new JPATipoEstadoDAO(em);
	}
	
	public List<Proyecto> consultarProyectos(){
		return proyectoDAO.findAll();
	}
	public List<Proyecto> buscarProyectos(Proyecto proyecto){
		if(proyecto.getEmpleado().getIdempleado() != null){
			proyecto.setEmpleado(empleadoDAO.findById(proyecto.getEmpleado().getIdempleado()));
		}
		if(proyecto.getTipoEstado().getIdtipoestado() != null){
			proyecto.setTipoEstado(tipoEstadoDAO.findByIdTipoEstado(proyecto.getTipoEstado().getIdtipoestado()));	
		}
		if(proyecto.getArea().getIdarea() != null){
			proyecto.setArea(areaDAO.findById(proyecto.getArea().getIdarea()));
		}
		if(proyecto.getFecInicioPresup() == null){
			Date fechaIni = new Date();
			DateFormat fecIni = new SimpleDateFormat ("yyyy-MM-dd");
			String strFechaIni = "1990-01-01";
			try {
				fechaIni = fecIni.parse(strFechaIni);
			} catch (ParseException ex) {
				ex.printStackTrace();
				System.out.println(ex.getMessage());
			}
			System.out.println("Inicializar Fecha de Inicio en: "+ fechaIni);
			proyecto.setFecInicioPresup(fechaIni);
		}
		if(proyecto.getFecFinPresup() == null){
			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
			GregorianCalendar calendar = new GregorianCalendar();
			try {
				Date fechaFin = format.parse("2099-12-12"); 
				calendar.setTime(fechaFin);
				System.out.println("Inicializar Fecha de Fin en: "+ fechaFin);
				proyecto.setFecFinPresup(fechaFin);
			} catch (ParseException ex) {
				System.out.println(ex.getMessage());
			}
		}	
		return proyectoDAO.findByCriterio(proyecto);
	}
	public List<Proyecto> consultarProyectoxJefe(Integer idjefe) throws Exception {
		return proyectoDAO.findByJefe(idjefe);
	}
	
	public List<Area> consultarAreas(){
		return areaDAO.findAll();
	}
	
	public List<Empleado> consultarJefeProyecto(Integer idjefe){
		return empleadoDAO.findByJefe(idjefe);
	}
	
	public List<TipoEstado> consultarTipoEstado(){
		return tipoEstadoDAO.findAll();
	}
	
	public Proyecto consultarProyecto(Integer idProyecto){
		return proyectoDAO.findById(idProyecto);
	}
	
	public Proyecto consultarProyectoxEntregable(Integer identregable) {
		return proyectoDAO.findByIdEntregable(identregable);
	}
	
	private String getMaxCodeProyecto() {
		Integer maxNum;
		if(proyectoDAO.findIdMayor() == null){
			maxNum = 1;
		}else{
			maxNum = proyectoDAO.findIdMayor()+1;
		}
		String maxCode = "P";
		if(maxNum <10){
			maxCode += "000" + maxNum;
		}else if(maxNum <100){
			maxCode += "00" + maxNum;
		}else if(maxNum <1000){
			maxCode += "0"+ maxNum;
		}else{
			maxCode += ""+ maxNum;
		}
		return maxCode;
	}
	
	public Proyecto registrarProyecto(Proyecto o){
		Proyecto newProyecto = null;
		
		EntityTransaction tx= em.getTransaction();

		try{
			tx.begin();
			Area area = areaDAO.findById(o.getArea().getIdarea());
			o.setArea(area);
			
			TipoEstado tipoestado = tipoEstadoDAO.findByIdTipoEstado(1);
			o.setTipoEstado(tipoestado);
			
			Empleado jefeProyecto = empleadoDAO.findById(o.getEmpleado().getIdempleado());
			o.setEmpleado(jefeProyecto);
			
			o.setCodproyecto(getMaxCodeProyecto());
			o.setDescripcion(o.getDescripcion());
			
			o.setComentario(o.getComentario());
			o.setEmpresaexterna(o.getEmpresaexterna());
			o.setNombrecontactoext(o.getNombrecontactoext());
			o.setNumcontactoext(o.getNumcontactoext());
			o.setFecInicioPresup(o.getFecInicioPresup());
			o.setFecInicioReal(o.getFecInicioReal());
			o.setFecFinPresup(o.getFecFinPresup());
			o.setFecFinReal(o.getFecFinReal());
			o.setEstadoRegistro("RE");
			o.setUsuCrea(o.getUsuCrea());
			o.setFecCrea(MetodoRecursivo.fecha());
			
			newProyecto = proyectoDAO.insert(o);
			tx.commit();

			System.out.println("Proyecto Registrado.");

			}catch(Exception ex){
				tx.rollback();
				ex.printStackTrace();
				System.out.println("MENSAJE: "+ ex.getMessage());
			throw new RuntimeException("No se pudo registrar.");
		}
		return newProyecto;
	}
	
	public void actualizarProyecto(Proyecto o){
		EntityTransaction tx= em.getTransaction();
		try{
			tx.begin();
			Proyecto updProyecto = proyectoDAO.findById(o.getIdproyecto());
			
			Area area = areaDAO.findById(o.getArea().getIdarea());
			updProyecto.setArea(area);
			
			Empleado jefeProyecto = empleadoDAO.findById(o.getEmpleado().getIdempleado());
			updProyecto.setEmpleado(jefeProyecto);
			
			updProyecto.setDescripcion(o.getDescripcion());
			
			updProyecto.setComentario(o.getComentario());
			updProyecto.setEmpresaexterna(o.getEmpresaexterna());
			updProyecto.setNombrecontactoext(o.getNombrecontactoext());
			updProyecto.setNumcontactoext(o.getNumcontactoext());
			updProyecto.setFecInicioReal(o.getFecInicioReal());
			updProyecto.setFecInicioPresup(o.getFecInicioPresup());
			updProyecto.setFecFinReal(o.getFecFinReal());
			updProyecto.setFecFinPresup(o.getFecFinPresup());
			updProyecto.setEstadoRegistro("RE");
			updProyecto.setUsuModi(o.getUsuCrea());
			updProyecto.setFecModi(MetodoRecursivo.fecha());
			
			proyectoDAO.update(updProyecto);
			tx.commit();
		}catch(Exception ex){
			tx.rollback();
			ex.printStackTrace();
			throw new RuntimeException("No se pudo actualizar.");
		}
	}
	
	public void eliminarProyecto(Integer idproyecto){
		EntityTransaction tx= em.getTransaction();
		try{
			tx.begin();
			System.out.println("Anulando Proyecto...: " + idproyecto);
			proyectoDAO.delete(idproyecto);
			tx.commit();
		}catch(Exception ex){
			tx.rollback();
			ex.printStackTrace();
			throw new RuntimeException("No se pudo eliminar");
		}
	}

}